package services.common;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSONObject;
import com.shove.Convert;
import com.zhongan.scorpoin.common.ZhongAnOpenException;

import common.constants.ConfConst;
import common.enums.AuditStatus;
import common.enums.Client;
import common.enums.Gender;
import common.enums.IsCaCertificatePass;
import common.enums.NoticeScene;
import common.enums.SholderBindStatus;
import common.utils.DateUtil;
import common.utils.Factory;
import common.utils.LoggerUtil;
import common.utils.PageBean;
import common.utils.RealNameAuthentic;
import common.utils.ResultInfo;
import common.utils.StrUtil;
import daos.common.CompanyInfoDao;
import daos.common.UserDao;
import daos.common.UserInfoDao;
import models.common.entity.t_company_info_side;
import models.common.entity.t_shareholder;
import models.common.entity.t_user;
import models.common.entity.t_user_info;
import play.cache.Cache;
import play.mvc.Scope.Session;
import services.base.BaseService;

public class UserInfoService extends BaseService<t_user_info> {
	
	private static final Logger logger = Logger.getLogger(UserInfoService.class);
	
	protected UserInfoDao userInfoDao = Factory.getDao(UserInfoDao.class);
	
	protected CompanyInfoDao companyInfoDao = Factory.getDao(CompanyInfoDao.class);
	
	protected static UserDao userDao = Factory.getDao(UserDao.class);
	
	protected static UserService userService = Factory.getService(UserService.class);
	
	protected static NoticeService noticeService = Factory.getService(NoticeService.class);
	
	protected static ShareholderService shareholderService = Factory.getService(ShareholderService.class);
	
	protected static CompanyInfoSideService companyInfoSideService = Factory.getService(CompanyInfoSideService.class);
	
	protected UserInfoService(){
		super.basedao = userInfoDao;
	}

	/**
	 * 判断一个邮箱是否已经存在，存在则返回true，不存在返回false
	 * @param email
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2015年12月25日
	 */
	public boolean isEmailExists(String email) {
		t_user user = userDao.findByColumn("lower(email)=lower(?)",email);
		if (user != null) {
			return true;
		}
		
		return false;
	}
	
	/**
	 * 获取用户交易信用积分
	 *
	 * @param userId
	 * @return
	 *
	 * @author yaoyi
	 * @createDate 2016年1月14日
	 */
	public double findUserCreditLine(long userId){
		
		return userInfoDao.findUserCreditLine(userId);
	}
	
	/**
	 * 根据user_id查询t_user_info
	 * 
	 * @param userId
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2015年12月22日
	 */
	public t_user_info findUserInfoByUserId(long userId) {
		
		return userInfoDao.findByColumn("user_id =?", userId);
	}
	
	/**
	 * 查询相应时间投资会员数目的数据
	 * 
	 * @param startTime
	 * @param endTime
	 * @param type
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2016年1月23日
	 *
	 */
	public int findFinancialUserCount(String startTime, String endTime, int type) {

		return userInfoDao.findFinancialUserCount(startTime, endTime, type);
	}
	
	/**
	 * 获取用户基本信息编辑进度
	 * 
	 * @param userId
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2016年1月29日
	 *
	 */
	public int findUserBasicSchedule(long userId){
		
		return userInfoDao.findUserBasicSchedule(userId);
	}
	
	/**
	 * 查询接受消息的所有用户的user_id
	 * 
	 * @param memberType 会员类型  -1-全部会员  0-新会员   1-投资会员    2-融通会员
	 * @param scene 通知场景
	 * @return
	 *
	 * @author liudong
	 * @createDate 2016年4月5日
	 *
	 */
	public List<Map<String, Object>> queryUserNoticeMsgSetting(int memberType,NoticeScene scene) {	
		
		return userInfoDao.queryUserNoticeMsgSetting(memberType, scene);
	}
	
	/**
	 * 查询接受短信的所有用户的mobile
	 * 
	 * @param memberType 会员类型  -1-全部会员  0-新会员   1-投资会员    2-融通会员
	 * @param scene 通知场景
	 * @return
	 *
	 * @author liudong
	 * @createDate 2016年4月5日
	 *
	 */
	public List<Map<String, Object>> queryUserNoticeSmsSetting(int memberType,NoticeScene scene){	
		
		return userInfoDao.queryUserNoticeSmsSetting(memberType, scene);
	}
	
	/**
	 * 查询接受邮件的所有用户的邮件地址
	 * 
	 * @param memberType 会员类型  -1-全部会员  0-新会员   1-投资会员    2-融通会员
	 * @param scene 通知场景
	 * @return
	 *
	 * @author liudong
	 * @createDate 2016年4月5日
	 *
	 */
	public List<Map<String, Object>> queryUserNoticeEmailSetting(int memberType,NoticeScene scene) {
		
		return userInfoDao.queryUserNoticeEmailSetting(memberType, scene);
	}
	
	/**
	 * 添加用户基本信息
	 * 
	 * @param userId 用户id
	 * @param client 注册入口
	 * @param mobile 手机号码
	 * @param name 用户名
	 * @return
	 * 
	 * @author Chenzhipeng
	 * @createDate 2015年12月19日
	 */
	public boolean addUserInfo(long userId, Client client, String mobile, String name,String email) {
		t_user_info userInfo = new t_user_info();
		userInfo.user_id = userId;
		userInfo.setClient(client.PC);
		userInfo.mobile = mobile;
		userInfo.name = name;
		userInfo.email=email;
		//userInfo.credit_line = Convert.strToDouble(ConfConst.CREDIT_LINE, 0.00);
		//userInfo.credit_score = Convert.strToInt(ConfConst.CREDIT_SCORE, 0);
		userInfo.photo = "/public/common/defaultUser.png";
		
		return userInfoDao.save(userInfo);
	}
	
	/**
	 * 添加用户基本信息
	 * 
	 * @param userId 用户id
	 * @param client 注册入口
	 * @param mobile 手机号码
	 * @param name 用户名
	 * @return
	 * 
	 * @author Chenzhipeng
	 * @createDate 2015年12月19日
	 */
	public boolean addUserInfo(long userId, Client client, String mobile, String name,String email,AuditStatus status) {
		t_user_info userInfo = new t_user_info();
		userInfo.user_id = userId;
		userInfo.setClient(client.PC);
		userInfo.mobile = mobile;
		userInfo.name = name;
		userInfo.email=email;
		userInfo.setChange_mobile_status(status);
		//userInfo.credit_line = Convert.strToDouble(ConfConst.CREDIT_LINE, 0.00);
		//userInfo.credit_score = Convert.strToInt(ConfConst.CREDIT_SCORE, 0);
		userInfo.photo = "/public/common/defaultUser.png";
		
		return userInfoDao.save(userInfo);
	}
	/**
	 * 修改用户邮箱地址
	 * 
	 * @param userId
	 * @param email
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2015年12月22日
	 */
	public ResultInfo updateUserEmail(long userId, String email) {
		ResultInfo result = new ResultInfo();
		
		t_user_info userInfo = this.findUserInfoByUserId(userId);
		if (userInfo == null) {
			result.code = -1;
			result.msg = "查询用户信息失败";
			
			return result;
		}
		
		/* 判断邮箱是否被其他用户绑定 */
		if (isEmailExists(email) && email.equals(userInfo.email)) {
			result.code = -1;
			result.msg = "邮箱已被其他用户绑定";
			
			return result;
		}
		
		int i = userInfoDao.updateUserEmail(userId, email);
		if (i < 0) {
			result.code = -1;
			result.msg = "邮箱修改失败";
			return result;
		}
		
		/** 发送通知  */
		Map<String, Object> noticeParams = new HashMap<String, Object>();
		noticeParams.put("user_name", userInfo.name);
		noticeService.sendSysNotice(userId, NoticeScene.BIND_EMAIL_SUCC, noticeParams);
		
		result.code = 1;
		result.msg = "邮箱修改成功";
		/* 刷新用户缓存信息 */
		userService.flushUserCache(userId);
		
		return result;
	}
	
	/**
	 * 修改用户真实姓名、出生日期、性别
	 * （通过判断身份证号码获取性别和出生日期）
	 * 
	 * @param userId 用户Id
	 * @param realityName 真实姓名
	 * @param idNumber 身份证号码
	 * @return
	 * 
	 * @author Chenzhipeng
	 * @createDate 2015年12月24日
	 */
	public ResultInfo updateUserInfo(t_user_info userInfo) {
		ResultInfo result = new ResultInfo();
		IsCaCertificatePass isCaCertificatePass = userInfo.getCa_authentication_status();
		t_user_info userInfo2 = findByID(userInfo.id);
		userInfo2.setCa_authentication_status(isCaCertificatePass);
		userInfo2.mobile = userInfo.mobile;
		userInfo2.reality_name = userInfo.reality_name;
		userInfo2.email = userInfo.email;
		userInfo2.id_number = userInfo.id_number;
		userInfo2.is_email_verified = userInfo.is_email_verified;
		userInfo2.birthday = userInfo.birthday;
		userInfo2.address = userInfo.address;
		userInfo2.id_card_pic_on = userInfo.id_card_pic_on;
		userInfo2.id_card_pic_under = userInfo.id_card_pic_under;
		userInfo2.add_base_info_schedule = userInfo.add_base_info_schedule;
		userInfo2.new_mobile = userInfo.new_mobile;
		userInfo2.setChange_mobile_status(userInfo.getChange_mobile_status());
		
		
		if (StringUtils.isBlank(userInfo2.reality_name)) {
			result.code = -1;
			result.msg= "请先完成实名认证资料的填写";
			
			return result;
		}
		
		if (StringUtils.isBlank(userInfo2.id_number)) {
			result.code = -1;
			result.msg= "请先完成实名认证资料的填写";
			
			return result;
		}
		/* 通过身份证号码获取出生日期 */
		userInfo2.birthday = DateUtil.strToDate(userInfo2.id_number.substring(6, 14), "yyyyMMdd");
		/* 通过身份证号码获取性别 */
		int sex = Convert.strToInt(userInfo2.id_number.substring(16, 17), 0);
		if(sex % 2 == 0){
			userInfo2.setSex(Gender.FEMALE);
		}else{
			userInfo2.setSex(Gender.MALE);
		}
		
		boolean isFlag = userInfoDao.save(userInfo2);
		if (!isFlag) {
			result.code = -1;
			result.msg= "用户实名认证信息添加失败";
			
			return result;
		}
		result.code = 1;
		result.msg= "用户实名认证信息添加成功";
		
		return result;
	}
	
	/**
	 * 修改用户信息
	 * 
	 * @param userId 用户Id
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年4月21日
	 */
	public ResultInfo updateUserAuditInfo(t_user_info userInfo) {
		ResultInfo result = new ResultInfo();
		boolean isFlag = userInfoDao.save(userInfo);
		if (!isFlag) {
			result.code = -1;
			result.msg= "更新个人信息失败";
			LoggerUtil.error(true, "更新个人信息失败");
			return result;
		}
		result.code = 1;
		result.msg= "审核个人信息成功";
		
		return result;
	}
	
	
	
	
	/**
	 * 修改用户基本信息
	 * 
	 * @param userId 用户Id
	 * @param education 学历
	 * @param marital  婚姻
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2015年12月24日
	 */
	public ResultInfo updateUserBasicInfo(long userId, int education, int marital) {
		ResultInfo result = new ResultInfo();
		
		int i = userInfoDao.updateUserBasicInfo(userId, education, marital);
		if (i < 1) {
			result.code = -1;
			result.msg = "用户信息修改失败";
			
			return result;
		}
		/* 获取当前用户的信息完成进度 */
		int schedule = checkUserBasicSchedule(userId);
		i = userInfoDao.updateUserInfoSchedule(userId, schedule);
		if (i < 1) {
			result.code = -1;
			result.msg = "用户信息修改失败";
			
			return result;
		}
		
		result.code = 1;
		result.msg = "用户信息修改成功";
		
		return result;
	}
	
	/**
	 * 修改用户资产信息
	 * 
	 * @param userId 用户Id
	 * @param workExperience 工作经验
	 * @param annualIncome 年收入
	 * @param netAsset 净资产
	 * @param car 车产
	 * @param house 房产
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2015年12月24日
	 */
	public ResultInfo updateUserAssetsInfo(long userId, int workExperience,
			int annualIncome, int netAsset, int car, int house) {
		ResultInfo result = new ResultInfo();

		int i = userInfoDao.updateUserAssetsInfo(userId, workExperience, annualIncome, netAsset, car, house);
		if (i < 0) {
			result.code = -1;
			result.msg = "用户资产信息修改失败";
			
			return result;
		}
		/* 获取当前用户的信息完成进度 */
		int schedule = checkUserBasicSchedule(userId);
		i = userInfoDao.updateUserInfoSchedule(userId, schedule);
		if (i < 0) {
			result.code = -1;
			result.msg = "用户资产信息修改失败";
			
			return result;
		}
		
		result.code = 1;
		result.msg = "用户资产信息修改成功";
		
		return result;
	}
	
	/**
	 * 修改用户紧急联系人
	 * 
	 * @param userId 用户Id
	 * @param name 紧急联系人姓名
	 * @param type 紧急联系人类型
	 * @param mobile 紧急联系人手机号码
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2015年12月24日
	 */
	public ResultInfo updateEmergencyContact(long userId, String name, int type,
			String mobile) {
		ResultInfo result = new ResultInfo();
		
		/* 判断否是为本人的手机号码 */
		t_user user = userService.findUserById(userId);
		if (user.mobile.equals(mobile)) {
			result.code = -1;
			result.msg = "不能使用本人的手机号码作为紧急联系人手机号";
			
			return result;
		}
		
		int i = userInfoDao.updateEmergencyContact(userId, name, type, mobile);
		if (i < 0) {
			result.code = -1;
			result.msg = "紧急联系人信息修改失败";
			
			return result;
		}
		
		/* 获取当前用户的信息完成进度 */
		int schedule = checkUserBasicSchedule(userId);
		i = userInfoDao.updateUserInfoSchedule(userId, schedule);
		if (i < 0) {
			result.code = -1;
			result.msg = "紧急联系人信息修改失败";
			
			return result;
		}
		
		result.code = 1;
		result.msg = "紧急联系人信息修改成功";
		
		return result;
	}
	
	/**
	 * 更新会员类型
	 *
	 * @param userId 用户ID
	 * @param memberType 会员类型枚举
	 *
	 * @author yaoyi
	 * @createDate 2015年12月25日
	 */
	public boolean updateUserMemberType(long userId, t_user_info.MemberType memberType) {
		t_user_info userInfo = findUserInfoByUserId(userId);
		if (userInfo == null) {
			LoggerUtil.info(true, "更新会员类型时，用户信息不存在。[userId:%s]", userId);
			
			return false;
		}

		return userInfoDao.updateUserMemberType(userId, memberType, userInfo.getMember_type());
	}

	/**
	 * 修改用户信息中手机号码
	 * 
	 * @param userId
	 * @param mobile
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2016年1月7日
	 *
	 */
	public ResultInfo updateUserMobile(long userId, String mobile) {
		ResultInfo result = new ResultInfo();
		int i = userInfoDao.updateUserInfoMobile(userId, mobile);
		if (i < 0) {
			result.code = -1;
			result.msg = "手机号码修改失败";
			return result;
		}
		result.code = 1;
		result.msg ="手机号码修改成功";
		
		return result;
	}
	
	/**
	 * 获取当前用户信息完成进度
	 * 
	 * @param userId
	 * @return
	 *
	 * @author Chenzhipeng
	 * @createDate 2016年1月29日
	 *
	 */
	private int checkUserBasicSchedule(long userId){
		t_user_info userInfo = findUserInfoByUserId(userId);
		int schedule = 0;
		
		/* 基本信息进度 */
		if(userInfo.getEducation() != null && userInfo.getMarital() != null){
			schedule += 1;
		}
		
		/* 资产信息进度 */
		if(userInfo.getWork_experience() != null && userInfo.getAnnual_income() != null && userInfo.getNet_asset() != null && userInfo.getCar() != null 
					&& userInfo.getHouse() != null){
			schedule += 1;
		}
		
		/* 紧急联系人信息进度 */
		if(userInfo.getEmergency_contact_type() != null && StringUtils.isNotBlank(userInfo.emergency_contact_name) && StringUtils.isNotBlank(userInfo.emergency_contact_mobile)){
			schedule += 1;
		}
		
		return schedule;
	}
	
	
	/**
	 * 更新用户会员信息
	 *
	 * @param userId
	 * @param education
	 * @param marital
	 * @param workExperience
	 * @param annualIncome
	 * @param netAsset
	 * @param car
	 * @param house
	 * @param userSign
	 * @param emergencyContactType
	 * @param emergencyContactName
	 * @param emergencyContactMobile
	 * @return
	 *
	 * @author songjia
	 * @createDate 2016年3月31日
	 */
	public ResultInfo updateUserInformation(long userId, int education, int marital, int workExperience, int annualIncome, int netAsset,
			int car, int house, int emergencyContactType, String emergencyContactName, String emergencyContactMobile) {
		ResultInfo result = new ResultInfo();
		
		int i = userInfoDao.updateUserInformation(userId, education, marital, workExperience, annualIncome, netAsset, car, house, emergencyContactType, emergencyContactName, emergencyContactMobile);
		if (i < 0) {
			result.code = -1;
			result.msg = "会员信息修改失败";
			
			return result;
		}
		
		/* 获取当前用户的信息完成进度 */
		int schedule = checkUserBasicSchedule(userId);
		i = userInfoDao.updateUserInfoSchedule(userId, schedule);
		if (i < 0) {
			result.code = -1;
			result.msg = "会员信息修改失败";
			
			return result;
		}
		
		result.code = 1;
		result.msg = "会员信息修改修改成功";
		
		return result;
	}
	
	/**
	 * 清除用户实名认证信息
	 * 
	 * @param userId 用户ID
	 * @param realityName 真实姓名
	 * @param idNumber 身份证号码
	 * @return
	 *
	 * @author YanPengFei
	 * @createDate 2016年07月07日
	 */
	public ResultInfo updateRealName(long userId, String realityName, String idNumber) {
		ResultInfo result = new ResultInfo();
		
		int i = userInfoDao.updateRealName(userId, realityName, idNumber);
		
		if (i < 1) {
			result.code = -1;
			result.msg = "用户实名信息清除失败";
			
			return result;
		}
		
		result.code = 1;
		result.msg = "用户实名信息清除成功";
		
		return result;
	}
	
	/**
	 * 判断一个身份证号码是否已经存在，存在则返回true，不存在返回false
	 * @param idNumber
	 * @return
	 *
	 * @author YanPengFei
	 * @createDate 2016年08月01日
	 */
	public boolean isIdNumberExists(String idNumber) {
		t_user_info userInfo = userInfoDao.findUserInfoByIdNumber(idNumber);
		
		if (userInfo != null) {
			
			return true;
		}
		
		return false;
	}

	/**
	 * 修改邮箱与绑定邮箱
	 * @param userId
	 * @param email
	 * @return
	 * @author binghui.zhou
	 * @createDate 2017年6月27日
	 */
	public boolean updateEmail(long userId, String email) {
		int in =userInfoDao.updateEmail(userId,email);
		if (in<0){
			return false;
		}
		return true;
	}

	/**
	 * 查个人用户列表，如果姓名、电话、邮箱地址都匹配,返回一个对象
	 * 
	 * @param sh_name
	 * @param sh_mobile
	 * @param sh_email
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年6月29日
	 */
	public t_user_info findPersonByRealNameMobileEmail(String real_name, String mobile,
			String email) {
		
		return userInfoDao.findPersonByRealNameMobileEmail(real_name, mobile, email);
	}
	
	/**
	 *  根据真实姓名和手机号查个人信息表
	 * 
	 * @param realityName
	 * @param mobile
	 * @return
	 * @author zhiliang.lan
	 * @createDate 2017年7月6日
	 */
	public t_user_info findByNameAndMobile(String realityName, String mobile) {
		
		return userInfoDao.findByNameAndMobile(realityName, mobile);
	}

	/**
	 * 校验实名认证的参数
	 * 
	 * @return
	 * @author zhiliang.lan
	 * @param mobile 
	 * @param idNo 
	 * @param email 
	 * @param real_name 
	 * @param userId 
	 * @param scene 验证码场景
	 * @param type 1手机验证码 2 邮箱验证码 0手机跟邮箱都存在的情况
	 * @param code  验证码
	 * @param is_company 
	 * @createDate 2017年8月7日
	 */
	public ResultInfo validateRealNameInfo(long userId, String real_name, String email, String idNo, String mobile, int type, String scene, String code,String id_card_pic_under,String id_card_pic_on, String bankPreMobile,String bankCardNo, int is_company) {
		
		ResultInfo result = new ResultInfo();
		
		if(StringUtils.isBlank(real_name)){
			result.code = -1;
			result.msg = "请填写真实姓名";
			return result;
		}
		if(StringUtils.isBlank(idNo)){
			result.code = -1;
			result.msg = "请填写真身份证号码";
			return result;
		}
		if(StringUtils.isBlank(id_card_pic_on)){
			result.code = -1;
			result.msg = "请上传身份证正面";
			return result;
		}
		if(StringUtils.isBlank(id_card_pic_under)){
			result.code = -1;
			result.msg = "请上传身份证反面";
			return result;
		}
		
		boolean flag = StrUtil.checkIdentityCode(idNo);
		if(flag == false){
			result.code = -1;
			result.msg = "身份证格式不正确";
			return result;
		}
		if(StringUtils.isBlank(mobile)){
			result.code = -1;
			result.msg = "请填写手机号码";
			return result;
		}
		
		if(!StrUtil.isMobileNum(mobile)){
			result.code = -1;
			result.msg = "手机号码不符合规范";
			return result;
		}
		
		//手机号码是否存在
		boolean i = userService.isMobileExistsExceptSelf(mobile, userId,is_company);
		if(true == i){
			result.code = -1;
			result.msg = "手机号码已存在";
			return result;
		}
//		
		if(StringUtils.isBlank(bankCardNo)){
			result.code = -1;
			result.msg = "请填写手机号码";
			return result;
		}if(StringUtils.isBlank(bankPreMobile)){
			result.code = -1;
			result.msg = "请填写银行预留手机号码";
			return result;
		}
		if(!StrUtil.isMobileNum(bankPreMobile)){
			result.code = -1;
			result.msg = "银行预留手机号码不符合规范";
			return result;
		}
//		
		if(StringUtils.isBlank(email)){
			result.code = -1;
			result.msg = "请填写邮箱";
			return result;
		}
		if(!StrUtil.isEmail(email)){
			result.code = -1;
			result.msg = "邮箱地址不符合规范";
			return result;
		}
		boolean j = userService.isEmailExistsExceptSelf(email, userId);
		if(true == j){
			result.code = -1;
			result.msg = "邮箱已存在";
			return result;
		}
		
		if (type == 1){
			/* 短信验证码验证 */
			if (StringUtils.isBlank(code)) {
				result.code = -1;
				result.msg = "请输入短信验证码";
				return result;
			}
			Object obj = Cache.get(mobile + scene);
			if (obj == null) {
				result.code = -1;
				result.msg = "短信验证码已失效";
				return result;
			}
			String codeStr = obj.toString();
			
			/** 短信验证码 验证 */
			if(ConfConst.IS_CHECK_MSG_CODE){
				if (!codeStr.equals(code)) {
					result.code = -1;
					result.msg = "短信验证码错误";
					return result;
					
				}else{
					//清除缓存中的短信验证码
					Cache.delete(mobile + scene);
	                /* 清除缓存中的验证码 */
				    String encryString = Session.current().getId();
		          	Object cache = Cache.get(mobile + encryString + scene);
		         	if(cache != null){
		    		  Cache.delete(mobile + encryString + scene);
		    		  Cache.delete(mobile + scene);
		          	}
				}
			}
		}
		else if (type == 2){
			/* 短信验证码验证 */
			if (StringUtils.isBlank(code)) {
				result.code = -1;
				result.msg = "请输入邮箱验证码";
				return result;
			}
			
			Object obj = Cache.get(email + scene);
			if (obj == null) {
				result.code = -1;
				result.msg = "邮箱验证码已失效";
				return result;
			}
			String codeStr = obj.toString();
			/** 邮箱 验证 */
			if(ConfConst.IS_CHECK_EMAIL_CODE){
				if (!codeStr.equals(code)) {
					result.code = -1;
					result.msg = "邮箱验证码错误";
					return result;
				}else{
					//清除缓存中的短信验证码
					Cache.delete(mobile + scene);
	                /* 清除缓存中的验证码 */
				    String encryString = Session.current().getId();
		          	Object cache = Cache.get(mobile + encryString + scene);
		         	if(cache != null){
		    		  Cache.delete(mobile + encryString + scene);
		    		  Cache.delete(mobile + scene);
		          	}
				}
			}
		}
		
		result.code = 1;
		result.msg = "校验通过";
		
		return result;
	}

	/**
	 * 实名认证方法
	 * 
	 * @param userId 用户id
	 * @param real_name 真实姓名
	 * @param idNo 身份证号码
	 * @param mobile 用户登录电话号码
	 * @param email 用户邮箱
	 * @param id_card_pic_under 身份证反面
	 * @param id_card_pic_on 身份证正面
	 * @param bankPreMobile 银行卡预留电话
	 * @param bankCardNo 银行卡号
	 * @return
	 * @author zhiliang.lan
	 * @throws ZhongAnOpenException 
	 * @createDate 2017年8月7日
	 */
	
	public ResultInfo realNameIdentity(long userId, String real_name,String idNo, String mobile, String email,String id_card_pic_under,String id_card_pic_on,
			String  bankPreMobile,String bankCardNo) {
		ResultInfo result = new ResultInfo();
		t_user_info user_info = findByColumn(" reality_name =? AND  id_number=?", real_name,idNo);
		if(user_info == null ){
			result.code = -1;
			result.msg = "查询不到用户信息！";
			return result;
		}		
		t_user_info userInfo = findUserInfoByUserId(userId);
		if(null == userInfo){
			result.code = -1;
			result.msg = "未查到个人信息，实名认证失败";
			return result;
		}
		
		//保存两个填写的信息
		userInfo.reality_name = real_name;
		userInfo.id_number = idNo;
		userInfo.id_card_pic_under = id_card_pic_under;
		userInfo.id_card_pic_on = id_card_pic_on;
		userInfo.email = email;
		//3.实名认证接口，上面的是测试的接口，开发模式需要注释上一层，打开下一层
		result = RealNameAuthentic.realNameAuthentic(real_name, idNo,bankPreMobile,bankCardNo);
		if(result.code < 1){
			userInfo.setIdentity_audit_status(AuditStatus.FAILED_AUDIT);
			result = updateUserInfo(userInfo);
			if(result.code < 0){
				result.code = -1;
				LoggerUtil.error(true, result.msg);
				return result;
			}
			result.msg = "实名认证不通过";
			result.code = -1;
			return result;
		}else {
			//更新个人基本信息到t_user_info表
			userInfo.setIdentity_audit_status(AuditStatus.SUCCESS_AUDIT);
			result = updateUserInfo(userInfo);
			if(result.code < 0){
				result.code = -1;
				result.msg = "实名认证失败";
				LoggerUtil.error(true, "更新失败");
				return result;
			}
			
			result.code = 1;
			result.msg = "实名认证成功";
			
			//刷新缓存
			userService.flushUserCache(userId);
			
			//4.5实名认证成功之后，根据登录人信息查询股东表中是否有匹配的记录，如果有,并且基本资料审核状态是审核通过，则绑定股东信息，更新为绑定状态
			List<t_shareholder> shareholderList = shareholderService.findShareHolderByNameAndMobile(userInfo.reality_name, mobile);
			if(shareholderList != null && shareholderList.size() > 0 ){
				for (t_shareholder sholder : shareholderList) {
					sholder.user_id = userId;
					sholder.sh_idcard = idNo;
														  
					t_company_info_side companyInfoSide = companyInfoSideService.findCompanyInfoSideByUserId(sholder.company_user_id);
					//如果企业基本审核资料是已通过的，则设置股东状态为“已绑定”，否则不改变状态
					if(companyInfoSide.getBasic_info_audit_status().code == AuditStatus.SUCCESS_AUDIT.code){
						sholder.setSholderBondStatus(SholderBindStatus.HAVE_BINDING);
					}
					
					result = shareholderService.updateShareholer(sholder);
					if(result.code < 0){
						result.code = -1;
						result.msg = "更新失败";
						LoggerUtil.error(true, "更新失败");
						return result;
					}
				}
			}
			
//			System.out.println("返回值是："+json);
		}
		
		return result;
	}

	/**
	 *	个人认证审核
	 * @param orderValue
	 * @param showType
	 * @param currPage
	 * @param pageSize
	 * @param userName
	 * @param exports
	 * @return
	 * @author Liangqiongfeng
	 *@version 2018-3-14 
	 */
	public PageBean<t_user_info> pageOfAuditPersonage(int orderValue,
			int showType, int currPage, int pageSize, String userName,
			int exports) {
		
		return userInfoDao.pageOfAuditPersonage(orderValue,showType, currPage, pageSize,
				userName, exports);
	}

	/**
	 * 查询个人更改绑定手机号码审核信息
	 * @param showType
	 * @param currPage
	 * @param pageSize
	 * @param orderType
	 * @param orderValue
	 * @param exports
	 * @param userName
	 * @param userMobile
	 * @return
	 * @author liangqiongfeng
	 *@version 2018-5-11 
	 */
	public PageBean<t_user_info> pageOfMobile(int showType, int currPage,
			int pageSize, int orderType, int orderValue, int exports,
			String userName, String userMobile) {
		
		return userInfoDao.pageOfMobile( showType,  currPage,
			 pageSize,  orderType,  orderValue,  exports,
			 userName,  userMobile);
	}

}
